T-gateway api 설치 및 간단 테스트

개요

게아를 한번 직접 써보는 시간을 가지자.
예전에도 간단하게나마 시도는 했지만 그때의 수준은 너무 미약했던 것 같다.

안그래도 Keycloak쿠버네티스 인증 OIDC로 사용하려는 만큼, TLS 세팅도 진행한다.

어떤 구현체?

이게 사실 잘 모르겠다.
많은 구현체가 있으나 비교 글도 많지 않고 대체로 뭘 쓰는지에 대한 정보도 딱히 없는 것 같다.
그래서 당장은 내게 익숙한 nginx fabric나, 그나마 사람들이 쓰는 것 같은 kong을 써보려고 한다.

설치

이번에도 헬름을 이용해본다.

helm install nginx-gateway oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace -n nginx-gateway

이건 nginx.

helm repo add kong https://charts.konghq.com
helm repo update kong
helm upgrade --install kgo kong/gateway-operator -n kong-system --create-namespace --set image.tag=1.4 --set kubernetes-configuration-crds.enabled=true --set env.ENABLE_CONTROLLER_KONNECT=true

이건 kong[1]
Pasted image 20250130114000.png
이 헬름에서는 gateway api 자체도 추가시켜준다.

gateway api 세팅

기본이 되는 녀석들을 구성해보자.
첫번째는 gatewayClass인데, 이전에 kong에서는 데이터 플레인, 컨트롤 플레인 관련을 설정을 추가적으로 해줘야 한다.
이때 gatewayConfiguration을 먼저 만들어 사용할 수 있다.

kind: GatewayConfiguration
apiVersion: gateway-operator.konghq.com/v1beta1
metadata:
 name: kong
 namespace: kong-system
spec:
 dataPlaneOptions:
   deployment:
     podTemplateSpec:
       spec:
         containers:
         - name: proxy
           image: kong:3.9.0
           readinessProbe:
             initialDelaySeconds: 1
             periodSeconds: 1
 controlPlaneOptions:
   deployment:
     podTemplateSpec:
       spec:
         containers:
         - name: controller
           image: kong/kubernetes-ingress-controller:3.4.1
           env:
           - name: CONTROLLER_LOG_LEVEL
             value: debug'

이런 식으로 세팅을 해준다.
이렇게 하기 싫다면 또 데이터 플레인, 컨트롤 플레인을 각각 또 crd로 넣는 것도 가능하다.

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: kong-gateway-class
spec:
  controllerName: konghq.com/gateway-operator
  parametersRef: 
    group: gateway-operator.konghq.com 
    kind: GatewayConfiguration 
    name: kong 
    namespace: kong-system

시작은 간단하게 해본다.
여기에 추가적인 설정을 넣는 것도 가능하고, kong의 경우 configuration CRD까지 제공하고 있어 더 상세한 커스텀이 가능하다.
Pasted image 20250130115555.png
status가 accepted로 되면 잘 된 것이다.
Pasted image 20250130121741.png
다음은 gateway 세팅인데, 뭔가 또 안 된다.
이거 최근에 숱하게 봤는데, CoreDNS로 트래픽은 가지만 응답 트래픽이 돌아가지 않을 때 발생하는 문제였다.
클러스터를 껐다킬 때, 노드가 안전하게 종료되지 않아서 iptables에 문제가 생기고 이로 인해 응답 트래픽이 가는 규칙에 문제가 생기는 것이라 짐작하고 있다.
k -n kube-system rollout restart deploy corends
안 되면 재시작하면 된다.
나중에는 메트릭 수집하면서 문제 생길시 알아서 리스타트하게 만들어야겠다.
라고 생각했는데.. 계속 해결이 되지 않았다.
그래서 그냥 웹훅 정책을 그냥 무시로 바꿔봤다.
문제 생기면 다시 밀고 설치하지 뭐..
Pasted image 20250130132635.png
글쎄, 오히려 잘 된 듯하다.

kind: Gateway
metadata:
  name: keycloak-gateway
  namespace: keycloak
spec:
  gatewayClassName: kong-gateway-class
  listeners:
  - protocol: HTTPS
    port: 443
    name: keycloak-https
    hostname: keycloak.local
    tls:
      mode: Terminate
      certificateRefs:
      - kind: Secret
        group: ""
        name: tls-creds

게이트웨이 객체는 일단 이렇게 만들어줬다.
TLS를 사용하도록, 호스트네임으로 인증서도 발급 받아서 넣어주었다.
이제 여기에 route 객체들을 박아주면 된다!
Pasted image 20250130150800.png
라우트를 넣지 않고 그냥 했더니 이렇게 나온다.
Pasted image 20250130155420.png
되는대로 라우트를 때려박았는데, 이런 식으로 컨플릭도 뜬다.
에러 원인을 편하게 추적할 수 있다니 이건 혁신이야..

kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: keycloak-test
  namespace: keycloak
spec:
  parentRefs:
    - name: keycloak-gateway
      namespace: keycloak
  # hostnames:
  # - "keycloak.local"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /nginx
    - backendRefs:
      - name: test
        port: 80

서비스를 하나 띄우고, 이런 식으로 일단 테스트 중이다.
Pasted image 20250130160015.png
연결된 라우트는 게이트웨이 쪽에서도 확인된다.
Pasted image 20250130160100.png
성공적으로 되는 모습이다.
위에 객체 설정에서 backendRefs의 들여쓰기를 잘못해서 잠시 착각했는데, 기본 백엔드가 nginx로 연결돼있어서 이렇게 들어가는 게 정상이다.
되긴 하는데, 내가 원하는 것처럼 되지는 않는다.
Pasted image 20250130160232.png
오히려 해당 룰의 백엔드를 안 걸었더니 이런 에러가 뜬다.
보통이었으면 nginx의 404 에러가 떠야 하는데 주목할 만한 상황이다.
Pasted image 20250130184906.png
찾은 실수가 있었는데, 그 이상으로 또 문제가 있는 부분들을 찾았다.
하도 안 돼서 몇 번 껐다켜보기를 반복했다.
그런데 어떤 라우트를 먼저 넣냐에 따라 계속 결과가 달라졌다..
호스트 네임 설정 관련 이슈가 있었나?

kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: keycloak-http2https
  namespace: keycloak
spec:
  parentRefs:
    - name: keycloak-gateway
      namespace: keycloak
      sectionName: keycloak-http
  # hostnames:
  # - keycloak.local
  rules:
  - filters:
    - type: RequestRedirect
      requestRedirect:
          scheme: https
          statusCode: 301
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: keycloak-default-route
  namespace: keycloak
spec:
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: keycloak-gateway
      namespace: keycloak
      sectionName: keycloak-https
  hostnames:
  - keycloak.local
  rules:
    - matches:
        - path:
            # type: PathPrefix
            value: /
      backendRefs:
      - name: keycloak
        port: 80

일단 성공시킨 라우트의 양식은 이러하다.
80으로 들어오면 https로 리디렉트를 시키려고 했다.
Pasted image 20250130203634.png
근데 키클록에서 리디렉션시키는 주소가 또 http라서 적용이 안 돼버린다;
내가 validating webhook을 ignore시켜서 그런 것일 수도 있지만, 설정을 동적으로 변경시킬 수 있는 건지 아닌지가 제대로 구분되지 않아 테스트에 시간이 많이 지체되고 있다.
지금까지 겪은 이상한 상황은 이렇다.

분명하게 오브젝트를 만드는 순서에 결과가 영향을 받고 있다.

문서 정리가 완료되기 전까지 이후 내용은 Keycloak에 담도록 하겠다.

관련 문서

이름 noteType created

참고


  1. https://docs.konghq.com/gateway-operator/1.4.x/get-started/konnect/install/ ↩︎